package com.cskaoyan.javase.array._3exception._2null;
/**
 * NullPointerException(空指针异常):
 *      用来描述通过一个指向null的引用访问对象时的问题。
 *      当引用数据类型的引用指向了null（空常量）时，表示引用是没有指向任何对象
 *      这时如果还想通过引用操作堆上对象，就会空指针异常（因为没有任何对象可供操作）
 *
 * 注意事项:
 *      1.空指针异常针对所有引用数据类型，不仅仅是数组操作。
 *      2.空指针异常（NullPointerExceptionE），简称NPE，是Java之中最负盛名的异常，没有之一。
 *      以后大家会天天和引用数据类型打交道，也会每天和空指针异常打交道。
 *      空指针异常在多数情况下是有害的，会导致程序意外终止，避免空指针异常是Java程序员的必修课之一。
 *      常见的、最简单朴实的规避手段就是通过if进行判断，判断出引用不会指向null后再使用引用操作对象。
 *
 * 扩展:
 * 我们在开发时，要明确知道程序中的引用哪里会指向null，哪里完全不会指向null，对于：
 *      1.那些逻辑上，可能会指向null的引用，要在使用前慎重判断。如果等于null，需要做出相应处理（反正不能访问对象）
 *          判断不为null之后才能使用该引用访问对象。
 *          也就说,一个引用在我们的设计之中,如果本身就可能指向null,那么在使用之前应该做判断.
 *
 *      2.那些逻辑上，完全不可能等于null的引用，就不应该做判断了。
 *          一旦程序抛出空指针异常，要去排查为什么引用会等于null，然后修正程序。
 *
 * @since 16:13
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        int[] arr = null;
        // System.out.println(arr.length);
        // 如果直接输出引用,而不是通过引用操作对象,即便引用是null也没有关系,不会报错
        // System.out.println(arr);

        /*String str = null;
        if (str != null){
            // if判断避免空指针异常,是最常用,朴实有效的方法
            System.out.println(str.length());
        }*/

        /*
            数组下标越界表示访问了不合法的下标,它的前提是存在一个数组对象用于访问
            而这里引用指向null,根本没有对象可以访问
            所以抛出的异常是 NPE 空指针异常
         */
        System.out.println(arr[0]);

        /*
            上面已经产生NPE
            所以下面的代码是无法执行的
            所以这里看起来会产生一个数组下标越界
            实际上代码根本执行不到这里,也就不会产生任何异常了
         */
        arr = new int[3];
        System.out.println(arr[3]);

    }
}
